/**
 * 网络请求工具类
 * 封装微信小程序wx.request方法
 * 支持无感刷新token功能
 */

// 基础URL
const BASE_URL = 'http://119.29.16.246:8000';

// 请求超时时间（毫秒）
const TIMEOUT = 5000;

// 是否正在刷新token
let isRefreshing = false;

// 请求队列，存储刷新token期间的请求
let requestQueue = [];

// 调试模式
const DEBUG = true;

/**
 * 封装的请求方法
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求地址
 * @param {string} options.method - 请求方法
 * @param {Object} options.data - 请求数据
 * @param {Object} options.header - 请求头
 * @param {boolean} options.loading - 是否显示加载提示
 * @returns {Promise} 返回Promise对象
 */
const request = (options = {}) => {
  return new Promise((resolve, reject) => {
    // 默认显示加载提示
    if (options.loading !== false) {
      wx.showLoading({
        title: '加载中...',
        mask: true
      });
    }

    // 获取token
    const token = wx.getStorageSync('token');
    
    // 合并请求头，添加token
    const header = {
      'Content-Type': 'application/json',
      ...options.header
    };
    
    // 如果有token，添加到请求头
    if (token) {
      header['Authorization'] = `Bearer ${token}`;
    }

    // 发起请求
    wx.request({
      url: options.url.startsWith('http') ? options.url : `${BASE_URL}${options.url}`,
      method: options.method || 'GET',
      data: options.data,
      header: header,
      timeout: TIMEOUT,
      success: (res) => {
        // 请求成功，隐藏加载提示
        if (options.loading !== false) {
          wx.hideLoading();
        }
        
        // 根据后端接口规范判断请求是否成功
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
        } else if (res.statusCode === 401) {
          // token过期或无效，跳转到登录页
          wx.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none',
            duration: 2000
          });
          
          // 清除本地存储的token
          wx.removeStorageSync('token');
          
          // 延迟跳转到登录页
          setTimeout(() => {
            wx.navigateTo({
              url: '/pages/index/index'
            });
          }, 1500);
          
          reject(res);
        } else {
          // 其他错误
          wx.showToast({
            title: res.data.message || '请求失败',
            icon: 'none',
            duration: 2000
          });
          reject(res);
        }
      },
      fail: (err) => {
        // 请求失败，隐藏加载提示
        if (options.loading !== false) {
          wx.hideLoading();
        }
        
        // 显示错误提示
        wx.showToast({
          title: '网络异常，请稍后再试',
          icon: 'none',
          duration: 2000
        });
        
        reject(err);
      }
    });
  });
};

/**
 * GET请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const get = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'GET',
    data,
    ...options
  });
};

/**
 * POST请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const post = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  });
};

/**
 * PUT请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const put = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  });
};

/**
 * DELETE请求
 * @param {string} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其他配置
 * @returns {Promise} 返回Promise对象
 */
const del = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  });
};

// 导出
module.exports = {
  request,
  get,
  post,
  put,
  delete: del
};